// 对象的访问器（访问并且加工数据） get set 修饰的方法
let user = {
    name: 'wangwu',
    age: 32,
    color: 'green',
    like: ['cat', 'dog'],
    data: {
        firstName: 'wang',
        lastName: 'wu'
    },
    get firstName() {
        console.log('getFirstName---get');
        return this.data.firstName + '---get';
    },
    set firstName(val) {
        console.log('getFirstName---set');
        this.data.firstName = val + '---set';
        return true;
    }
};

user.firstName = 'li';
console.log('对象的访问器 get set 修饰的方法=>', user, user.firstName);


// 服务器去实现一个计算属性的功能
let lesson = {
    list: [
        {
            name: 'js',
            price: 100,
            color: 'red'
        },
        {
            name: 'html',
            price: 50,
            color: 'green'
        },
        {
            name: 'css',
            price: 49,
            color: 'blue'
        }
    ],
    get total() {
        return this.list.reduce((pre,next) => pre + next.price, 0)
    },
};

console.log('服务器去实现一个计算属性的功能:', lesson.total);

// 访问器批量设置值
let web = {
    name: '百度',
    url: 'wwww.baidu.com',
    set do(value) {
        let [name, url] = value.split(',');
        this.name = name;
        this.url = url;
    }
};
web.do = '阿里巴巴,www.alibbab.com';
console.log('访问器批量设置值:', web);

// 访问器与本地存储结合
const myStore = {
    data: {
        key: '12344'
    },
    get token() {
        let token = window.localStorage.getItem('token');
        if (!token) return undefined;
        return token;
    },
    set token(value) {
        window.localStorage.setItem('token', value);
    }
};
myStore.token = 'wvcbwuecnweocw';
console.log('访问器与本地存储结合:', myStore.token);


// 访问器优先级高于同名属性------因为自定义的访问器覆盖率原属性原来的访问器
const DATA = Symbol();
const player = {
    [DATA]: {
        name: 'zhaoliu'
    },
    age: 34,
    get name() {
        console.log('访问器优先级高于同名属性----name---get');
        return this[DATA].name;
    },
    set name(value) {
        console.log('访问器优先级高于同名属性----name---set', value);
        this[DATA].name = value;
        return true;
    }
};
player.name = 'make';
console.log('访问器优先级高于同名属性:', player);


// 访问器在构造函数中使用
class User {
    constructor(name, age) {
        this[DATA] = {
            name,
            age
        }
    };
    get name() {
        return this[DATA].name + '----get';
    };
    set name(val) {
        this[DATA].name = val + '-----set';
    }
    get age() {
        return this[DATA].age + '----get';
    };
    set age(val) {
        this[DATA].age = val + '-----set';
    }
};

let user1 = new User('zhangsan0000', 76);
user1.name = 'zhangsan9999';
console.log('访问器在构造函数中使用:', user1, user1.age);
